package main

import "fmt"

func main() {
	//a := 0
	//fmt.Scan(&a)
	//fmt.Printf("%d\n", a)
	// 目标： C(m, n), 从m中取n个数据，这里一共有多少种组合, m 指的是 1～m
	// 测试用例
	m := 5
	n := 2
	res := handleC(m, n)

	for i := 0; i < len(res); i++ {
		for j := 0; j < len(res[i]); j++ {
			fmt.Printf(string(res[i][j]), ",")
		}
		fmt.Printf("/n")
	}
}

func handleC(m int, n int) [][]int {
	// 思路: 使用回溯，逐个获取，最终取得符合条件的结果
	// 构建库集
	var res [][]int
	var sourceArr []int
	var tempRes []int
	for i := 1; i <= m; i++ {
		sourceArr = append(sourceArr, i)
	}

	// 判定边界
	if m < n {
		return res
	}

	var dfs func(arrIdx int, nIdx int)
	dfs = func(idx int, nIdx int) {
		// 判定回溯边界, 如果长度已经符合条件，则到达边界, 添加结果，并返回
		if nIdx == n {
			res = append(res, append([]int{}, tempRes...))
			return
		}
		// 判定回溯边界2，如果idx越界，则退出
		if idx >= len(sourceArr) {
			return
		}

		// 取当前下标值，并移动下一位回溯
		tempRes = append(tempRes, sourceArr[idx])
		dfs(idx+1, nIdx+1)
		tempRes = tempRes[:len(tempRes)-1]

		// 不取当前下标值，并移动下一位回溯
		dfs(idx+1, nIdx)
	}

	dfs(0, 0) // 从第一个取值

	return res
}
